#ifndef CAN_THREAD_H
#define CAN_THREAD_H

#include "ControlCAN.h"

#include <QThread>


/**
 * @brief The CanThread class
 *
 * @see 接口函数库（二次开发库）使用说明书.pdf, QT_Example,  from https://www.cxcan.com/
 */
class CanThread : public QThread
{
    Q_OBJECT
public:
    CanThread();

    void Stop();

    /**
     * 1. 打开CAN设备
     *
     * @param deviceType 设备类型. 不同的产品型号对应不同值, 详见适配器设备类型定义.
     * @param debicIndex 设备索引, 比如当只有一个USB-CAN适配器时，索引号为0; 再插入一个USB-CAN适配器, 那么后该设备索引号就是1
     * @param baudRate 波特率, 单位kbps, 常见值100, 125, 250, 500, 1000
     * @return 打开设备结果
     */
    bool OpenDevice(UINT deviceType, UINT debicIndex, UINT baudRate);

    /**
     * 2. 初始化CAN
     */
    bool InitCan();

    /**
     * 3. 启动CAN
     */
    bool StartCan();

    /**
     * 4. 发送数据
     *
     * @param channel
     * @param id
     * @param remoteFlag
     * @param externFlag
     * @param data
     * @param len
     * @return
     */
    bool SendData(UINT channel, UINT id, BYTE remoteFlag,
                  BYTE externFlag, const uint8_t * data, BYTE len);

    /**
     * 5. 关闭CAN设备
     */
    void CloseDeice();

    /**
     * 0. 复位设备, 回到3
     */
    bool ResetCan();

    UINT m_deviceType;
    UINT m_debicIndex;
    UINT m_baudRate;
    UINT m_debicCom;

    bool stopped;

    static constexpr int kChannelNum = 2;

signals:
    void GetProtocolData(VCI_CAN_OBJ * vci, unsigned int dwRel, unsigned int channel);
    void BoardInfo(VCI_BOARD_INFO);

private:
    void run() override;
    static void sleep(unsigned long msec);

};


// for test
extern void CanThreadTest();

#endif // CAN_THREAD_H
